package com.xaicode.locker.JavaSJMS.three.CreateMode.Prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 原型
 * 用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。
 * <p>
 * 浅复制：将一个对象复制后，基本数据类型的变量都会重新创建，而引用类型，指向的还是原对象所指向的。
 * 深复制：将一个对象复制后，不论是基本数据类型还有引用类型，都是重新创建的。
 * 简单来说，就是深复制进行了完全彻底的复制，而浅复制不彻底。
 * </p>
 * @author Locker
 * 	  <br> 2017年5月2日 下午12:19:21
 * @version v1.0
 */
public class Prototype implements Cloneable, Serializable {

	private static final long serialVersionUID = 1L;

	private String str;
	
	private SerializableObject obj;
	
	// 浅复制
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Prototype prototype = (Prototype) super.clone();
		return prototype;
	}
	
	// 深复制
	public Object deepClone() throws IOException, ClassNotFoundException {
		// 写入当前对象的二进制流 
        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        ObjectOutputStream oos = new ObjectOutputStream(bos);  
        oos.writeObject(this);  
  
        // 读出二进制流产生的新对象  
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
        ObjectInputStream ois = new ObjectInputStream(bis);  
        return ois.readObject();
	}
	
	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	public SerializableObject getObj() {
		return obj;
	}

	public void setObj(SerializableObject obj) {
		this.obj = obj;
	}

	class SerializableObject implements Serializable {

		private static final long serialVersionUID = 1L;
		
	}

}
